﻿/**
 *
 * @file FITKAssInstanceTR.h
 * @brief
 * @author LiBaojun (libaojunqd@foxmail.com)
 * @date 2024-03-29
 *
 */
#ifndef  _FITKINSTANCEASS_TR_H__
#define  _FITKINSTANCEASS_TR_H__

#include "FITKAbstractAssInstance.h"

namespace Interface
{
    /**
    * @brief 装配实例
    * @author LiBaojun (libaojunqd@foxmail.com)
    * @date 2024-03-22
    */
    class FITKInerfaceModelAPI FITKAssemblyInstanceTR : public  FITKAbstractAssInstance
    {
        FITKCLASS(Interface, FITKAssemblyInstanceTR);

    public:
        explicit FITKAssemblyInstanceTR() = default;
        virtual ~FITKAssemblyInstanceTR() = default;
        /**
         * @brief 设置平移参数
         * @param[i]  x              平移参数x
         * @param[i]  y              平移参数y
         * @param[i]  z              平移参数z
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        void setTransform(const double x, const double y, const double z);
        /**
         * @brief 设置旋转轴
         * @param[i]  p1             旋转轴第一点
         * @param[i]  p2             旋转轴第二点
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        void setRotateAxis(double* p1, double* p2);
        /**
         * @brief 设置旋转角度 角度制
         * @param[i]  a              转动角度 角度制
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        void setAngle(double a);
        /**
         * @brief 获取平移参数
         * @param[i]  transform      平移参数
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        void getTransfom(double* transform) const;
        /**
         * @brief 获取旋转轴线
         * @param[o]  p1             旋转轴第一点
         * @param[o]  p2             旋转轴第二点
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        void getRotateAxis(double* p1, double* p2) const;
        /**
         * @brief 获取旋转角度
         * @return double
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        double getAngle() const;

        /**
       * @brief 获取点坐标
       * @param[i]  pointID  点ID
       * @param[o]  coor 节点坐标
       * @param[i]  modelIndex 模型索引，用于复合模型（一个模型包含多个子模型）
       * @return  bool 是否获取成功
       * @author LiBaojun (libaojunqd@foxmail.com)
       * @date 2024-04-19
       */
        virtual bool getPointCoor(int pointID, double* coor, int modelIndex = 0) override;

    private:
        /**
         * @brief 平移
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        double        _trans[3] = { 0.0, 0.0, 0.0 };
        /**
         * @brief 旋转轴第一点
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        double        _rotate1[3] = { 0.0, 0.0, 0.0 };
        /**
         * @brief 旋转轴第二点
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        double        _rotate2[3] = { 0.0, 0.0, 0.0 };
        /**
         * @brief 旋转角度
         * @author LiBaojun (libaojunqd@foxmail.com)
         * @date 2024-03-25
         */
        double        _angle = 0.0;

    };
}


#endif
